CO2-uitstoot van auto’s in de Europese Unie: Tussen afname en de noodzaak tot verdere reductie#
Student namen: Laiba Shamsul, Popke Snoek, Yoshi Fu, Pepeyn Velthuijse
Team nummer: G4
Introductie#
De toenemende CO2-uitstoot door auto’s vormt een dringende uitdaging op het gebied van milieu en klimaatverandering. Wereldwijd heeft de transportsector een aanzienlijk aandeel in de totale uitstoot van broeikasgassen, waarbij auto’s een substantieel deel voor hun rekening nemen.
Om deze reden gaan we in deze data story de CO2-emissies in het wegverkeer analyseren tussen 2015 en 2021 om te bepalen of er sprake is geweest van een vermindering. We willen onderzoeken of het probleem van CO2-uitstoot echt zo ernstig is als wordt verondersteld en of voertuigen in aanzienlijke mate bijdragen aan dit probleem. Door het analyseren van de CO2-emissies in het wegverkeer gedurende deze periode kunnen we inzicht krijgen in de impact van voertuigen op het klimaat en de veranderingen die mogelijk hebben plaatsgevonden.
Om dit te onderzoeken zullen we gebruikmaken van visuele representaties zoals grafieken en diagrammen. Het gebruik hiervan maakt het gemakkelijker om complexe gegevens te interpreteren en verbanden te leggen tussen verschillende factoren die van invloed kunnen zijn op CO2-emissies. Zo kunnen we bijvoorbeeld de relatie onderzoeken tussen brandstoftypes en emissieniveaus. Deze inzichten kunnen ons helpen om een diepgaand begrip te krijgen van de mogelijke veranderingen die hebben plaatsgevonden in de CO2-uitstoot door wegverkeer.
Door deze gegevens op een visueel aantrekkelijke en begrijpelijke manier te presenteren, streven we ernaar om een objectieve en goed onderbouwde conclusie te trekken over de ernst van het CO2-uitstootprobleem en de rol van voertuigen daarin.
Show code cell content
# Import packages
from plotly.subplots import make_subplots
import plotly.express as px
import plotly.graph_objects as go
import pandas as pd
import numpy as np
Show code cell content
# Retrieve csv files for visualisations
country_emission = pd.read_csv("country_emission.csv")
ft_mean_emission = pd.read_csv("ft_mean_emission.csv")
car_emission_mass = pd.read_csv("car_emission_mass.csv")
total_emission = pd.read_csv("total_emission.csv")
df_counts = pd.read_csv("fuel_type_distribution.csv")
total_emission_per_ft = pd.read_csv("total_emission_per_ft.csv")
car_emission = pd.read_csv("car_emission.csv")
Dataset and preprocessing#
Voor onze data story hebben wij gebruik gemaakt van de CO2 Cars Emission Datasets van het Europees Mileauagentschap (EEA). De dataset is gevonden op de volgende website: https://www.eea.europa.eu/data-and-maps/data/co2-cars-emission-22. Dit zijn 7 datasets die de jaren 2015-2021 vertegenwoordigen en deze bevatten gegevens over de CO2-uitstoot van personenauto’s in Europa. In de datasets is informatie te vinden over de uitstoot van meerdere Europese landen en andere technische specificaties van de auto’s.
Om onze dataset voor te bereiden op verdere analyse, hebben we een reeks preprocessing-stappen toegepast. Ten eerste hebben we de zeven afzonderlijke datasets samengevoegd. Door deze datasets samen te voegen, konden we een meer omvattend beeld krijgen van de CO2-uitstoot van personenauto’s over een periode van zeven jaar waardoor het later makkelijker zou zijn om de visualisaties te creëren. Daarna hebben we onze dataset gefilterd op basis van de kolommen die we nodig hadden voor onze visualisaties, namelijk:
MS: De lidstaat waar het voertuig is geregistreerd.
Mk: Het merk van het voertuig.
Cn: De commerciële naam van het voertuig.
M (kg): Het gewicht aan van het voertuig in rijklare toestand.
Ewltp (g/km): De specifieke CO2-uitstoot van het voertuig gemeten volgens de Worldwide Harmonized Light Vehicles Test Procedure (WLTP), uitgedrukt in gram per kilometer.
Enedc (g/km): De specifieke CO2-uitstoot van het voertuig gemeten volgens de NEDC-testprocedure, uitgedrukt in gram per kilometer.
W (mm): De wielbasis.
Ft: Type brandstof.
Ernedc (g/km): De uitstootreductie van het voertuig in gram per kilometer volgens de New European Driving Cycle (NEDC) testprocedure, als gevolg van innovatieve technologieën die zijn toegepast.
Erwltp (g/km): De uitstootreductie van het voertuig in gram per kilometer volgens de WLTP-testprocedure, als gevolg van innovatieve technologieën die zijn toegepast.
We hebben de rijen met ontbrekende waarden verwijderd en de brandstoftypen gestandaardiseerd door slashes te vervangen door streepjes en alle tekst naar kleine letters om te zetten. Daarna hebben we een jaartalkolom toegevoegd aan de dataset, aangezien de oorspronkelijke datasets deze kolom niet bevatten omdat ze zich richtten op jaarlijkse uitstoot. We hebben ook de kolomnamen hernoemd om consistentie te creëren, aangezien de zeven datasets verschillende namen hadden voor dezelfde kolommen. Bovendien hebben we de rijen met ‘Hydrogen’ als brandstoftype uitgefilterd en waarden die volgens de NEDC testprocedure werden gemeten omgezet naar WLTP.
Door deze preprocessing-stappen toe te passen, hebben we een schone, gefilterde en getransformeerde dataset verkregen, die klaar was voor verdere analyse.
De positieve trend van CO2-uitstootvermindering#
Laten we allereerst een blik werpen op de totale uitstoot door de jaren heen, om zo de evolutie van de uitstoot te kunnen onderzoeken.
Show code cell source
# Plot settings
rows = 2
cols = 1
fig = make_subplots(rows=rows, cols=cols, x_title="Landcode", y_title="CO2 emissie in WLTP (g/km)")
for year in [2015, 2016, 2017, 2018, 2019, 2020, 2021]:
# Find index of 'IE' to split the countries on ('IE' is often in the middle).
country_emission_year = country_emission[country_emission["year"]==year].reset_index()
split_index = country_emission_year[country_emission_year["Country"]=="IE"].index
country_emission_split = np.split(country_emission[country_emission["year"]==year], split_index)
# Subplot settings
showlegend = True
for row in range(rows):
for col in range(cols):
index = cols * row + col
fig.append_trace(
go.Bar(
x=country_emission_split[index]["Country"],
y=country_emission_split[index]["Ewltp (g/km) mean"],
name=year,
marker=dict(color=px.colors.qualitative.Plotly[year-2015]),
showlegend=showlegend,
),
row=row + 1,
col=col + 1,
)
showlegend = False
fig.update_layout(
title_text="CO2-uitstoot door personenauto's per land in de EU tussen 2015 en 2021",
legend_title="Jaar",
)
fig.show()
Figuur 1. In dit staafdiagram, waarbij de x-as de landcodes vertegenwoordigt en de y-as de CO2-uitstoot in g/km (WLTP) weergeeft, wordt de gemiddelde CO2-uitstoot van personenauto’s in verschillende landen van de Europese Unie over de periode 2015-2021 getoond. Elke staaf in de grafiek vertegenwoordigt een specifiek jaar, aangegeven in de legenda. De kleur van elke staaf correspondeert met het betreffende jaar. Deze visualisatie geeft inzicht in de variatie en trends in CO2-uitstoot van personenauto’s tussen EU-landen over de jaren heen.
Uit de gegevens in Figuur 1 kunnen we afleiden dat er een opmerkelijke afname van de CO2-uitstoot is vastgesteld in alle landen. Dit suggereert dat de inspanningen om de CO2-uitstoot te verminderen effect beginnen te hebben, zelfs op wereldwijde schaal. Deze daling kan grotendeels worden toegeschreven aan de impact van de COVID-19-pandemie, die vanaf 2019 een grote vermindering in de uitstoot heeft veroorzaakt, zoals blijkt uit figuur 1. De lockdownmaatregelen en reisbeperkingen hebben geleid tot verminderde economische activiteiten, een afname van het transport en een vertraging in industriële processen, wat resulteerde in een positief effect op de uitstootniveaus (Liu, 2020).
Bovendien is het van belang om te onderzoeken hoe technologische innovaties in de loop der jaren hebben bijgedragen aan veranderingen in de CO2-uitstoot.
Show code cell source
# Plot settings
rows = 2
cols = 1
fig = make_subplots(rows=rows, cols=cols, x_title="Landcode", y_title="CO2 emissie reductie in WLTP (g/km)")
for year in [2015, 2016, 2017, 2018, 2019, 2020, 2021]:
# Find index of 'IE' to split the countries on ('IE' is often in the middle).
country_emission_year = country_emission[country_emission["year"]==year].reset_index()
split_index = country_emission_year[country_emission_year["Country"]=="IE"].index
country_emission_split = np.split(country_emission[country_emission["year"]==year], split_index)
# Subplot settings
for row in range(rows):
for col in range(cols):
index = cols * row + col
showlegend = row == col == 0
fig.append_trace(
go.Bar(
x=country_emission_split[index]["Country"],
y=country_emission_split[index]["Erwltp (g/km) mean"],
name=year,
marker=dict(color=px.colors.qualitative.Plotly[year-2015]),
showlegend=showlegend,
),
row=row + 1,
col=col + 1,
)
fig.update_layout(
title_text="Gemiddelde CO2-uitstoot vermindering vanwege innovatieve technologieën per land in de EU tussen 2015 en 2021",
legend_title="Jaar",
)
fig.show()
Figuur 2. In dit staafdiagram wordt de gemiddelde CO2-uitstoot getoond die is verminderd door innovatieve technologieën, per land, voor de jaren 2015 tot 2022. De x-as vertegenwoordigt de landcodes, terwijl de y-as de gemiddelde CO2-uitstoot vermindering (in g/km) weergeeft. Door middel van dit diagram kunnen wij onderzoeken welke landen significante vooruitgang hebben geboekt in het verminderen van CO2-uitstoot door innovatieve technologieën en kunnen we ook de prestaties over de jaren heen vergelijken.
Zoals we kunnen zien in het bovenstaande figuur is er een significante vermindering geweest in de uitstoot tussen 2015 en 2021 vanwege innovatieve technologieën, in de meeste landen. Dit omvat onder andere de opkomst van elektrische voertuigen (EV’s), die geen directe uitstoot van broeikasgassen hebben tijdens het rijden. De populariteit van EV’s is gestegen vanwege verbeteringen in batterijtechnologie, grotere beschikbaarheid van laadinfrastructuur en overheidsstimuleringsmaatregelen (Xing, 2021).
De beschikbare data kan worden gebruikt om de toename in populariteit van elektrische en semi-elektrische auto’s aan te tonen. Onder semi-elektrisch verstaan we voertuigen die zowel een verbrandingsmotor (meestal diesel of benzine) als een elektromotor gebruiken.
Show code cell source
# Definieer kleuren voor de brandstof types
colormap = {
"Elektrisch": 'blue',
"Semi-Elektrisch": 'purple',
"Anders": 'grey',
}
# Plot settings
fig = px.bar(df_counts,
x="year",
y="percent",
color="Ft",
title="Brandstof type distributie van personenauto's in de EU tussen 2015 en 2021",
labels={
"percent": "Percentage van alle personenauto's",
"year": 'Jaar',
"Ft": 'Brandstof type',
},
hover_data=['counts'],
color_discrete_map=colormap # Gebruik de kleurenkaart
)
fig.show()
Figuur 3. Deze staafdiagram visualiseert de verdeling van brandstoftypen voor personenauto’s in de Europese Unie tussen 2015 en 2021. De x-as vertegenwoordigt het jaar, terwijl de y-as het percentage van alle personenauto’s weergeeft. De hoogte van elke staaf correspondeert met het percentage van het totale aantal personenauto’s. Door de grafiek te bestuderen, kunnen we inzicht krijgen in de evolutie van brandstoftypen in de EU gedurende de afgelopen jaren.
In figuur 3 zien we bijvoorbeeld dat elektrische- en semi-elektrische auto’s veel meer worden gebruikt. Het percentage elektrische personenauto’s in de EU is gestegen van 0,45% in 2015 naar 10,01% in 2021.
Hieruit kunnen we dus afleiden dat de toename van elektrische auto’s gepaard is gegaan met meer technologische innovatie, wat uiteindelijk heeft geleid tot een aanzienlijke vermindering van de CO2-uitstoot van auto’s.
Het dringende belang van het verminderen van de CO2-uitstoot#
Hoewel er positieve trends zijn in het verminderen van de CO2-uitstoot, blijft het dringende belang van verdere emissiereductie onverminderd. Er blijven namelijk nog steeds uitdagingen bestaan die vragen om voortdurende actie op wereldwijde schaal. Als we bijvoorbeeld naar de gemiddelde en totale CO2-uitstoot kijken, kunnen we iets interessants opmerken.
Show code cell source
fig = make_subplots(specs=[[{"secondary_y": True}]])
years = [2015, 2016, 2017, 2018, 2019, 2020, 2021]
eu_emission = country_emission.groupby("year").sum()
fig.add_trace(
go.Scatter(x=years, y=eu_emission["Ewltp (g/km) mean"], name="Gemiddelde"),
secondary_y=False,
)
fig.add_trace(
go.Scatter(x=years, y=eu_emission["Ewltp (g/km) sum"], name="Totaal"),
secondary_y=True,
)
fig.update_layout(
title_text="Gemiddelde en totale CO2 emissie door personenauto's in de EU tussen 2015 en 2021",
xaxis_title="Jaar",
)
fig.update_yaxes(title_text="Gemiddelde CO2 emissie in WLTP (g/km)", secondary_y=False)
fig.update_yaxes(title_text="Totale CO2 emissie in WLTP (g/km)", secondary_y=True)
fig.show()
Figuur 4. Deze gecombineerde lijngrafiek toont de gemiddelde en totale CO2-emissie veroorzaakt door personenauto’s in de Europese Unie (EU) tussen 2015 en 2021. De x-as vertegenwoordigt het jaar, terwijl de y-as de gemiddelde CO2-emissie in WLTP (g/km) weergeeft voor de linker y-as en de totale CO2-uitstoot in WLTP (g/km) voor de rechter y-as. De lijn “Gemiddelde” vertegenwoordigt het gemiddelde emissieniveau, terwijl de lijn “Totaal” de cumulatieve emissie over de jaren weergeeft. Door de grafiek te bestuderen, kunnen we inzicht krijgen in de trend van CO2-emissies door personenauto’s in de EU gedurende de onderzochte periode.
Uit figuur 4 blijkt namelijk dat er een aanzienlijke afname was in zowel de gemiddelde als totale uitstoot van CO2 tussen 2018 en 2019. Na deze periode is er echter geen verdere verandering waargenomen. Het lijkt erop dat de genomen maatregelen en inspanningen effectief waren in het verminderen van de uitstoot, maar er is mogelijk behoefte aan verdere maatregelen om verdere vooruitgang te boeken en de uitstoot op een lager niveau te houden.
Wanneer we naar de totale CO2-uitstoot per brandstoftype kijken, kunnen we de volgende patronen waarnemen:
Show code cell source
# Plot settings
fig = px.bar(total_emission_per_ft,
x="Ft",
y="Ewltp (g/km)",
title="Totale CO2-uitstoot van personenauto's in de EU per brandstof type (2021)",
custom_data=[total_emission_per_ft["n"]],
labels={
"Ewltp (g/km)": "CO2 emissie in WLTP (g/km)",
"Ft": "Brandstof type",
}
)
fig.update_traces(hovertemplate="CO2 emissie in WLTP (g/km)=%{y}<br>Aantal auto's=%{customdata[0]}")
fig.show()
Figuur 5. Deze staafdiagram visualiseert de totale CO2-uitstoot van personenauto’s in de Europese Unie, ingedeeld naar brandstoftype. De x-as vertegenwoordigt de verschillende brandstoftypes, terwijl de y-as de CO2-uitstoot in WLTP (g/km) weergeeft. Elke staaf geeft de emissiewaarden weer voor een specifiek brandstoftype. Door deze visualisatie te lezen, kunnen we gemakkelijk de brandstoftypes identificeren die de hoogste en laagste CO2-uitstoot hebben, waardoor inzicht ontstaat in de impact van verschillende brandstoffen op de uitstoot van broeikasgassen in de transportsector.
We kunnen uit figuur 5 dus afleiden dat auto’s die op benzine rijden hoge hoeveelheden CO2 uitstoten. In de EU bedroeg de totale CO2-uitstoot van personenauto’s voor het brandstoftype ‘petrol’ namelijk 735.0874 miljoen gram per kilometer in één jaar. Als we de totale uitstoot delen door het aantal auto’s dat op dit type brandstof rijdt, komen we uit op een uitstoot van 135 g/km per auto. Vergeleken met het toegestane maximum van 95 g/km is dit erg hoog, wat aangeeft dat de emissie niveaus aanzienlijk overschreden worden en dat er behoefte is aan een reductie (bron toevoegen).
Show code cell source
df_split = np.array_split(car_emission, 8)
# Split data into different parts.
plot1 = px.scatter(df_split[0], x='year', y='Enedc (g/km) mean', color='Mk', color_discrete_sequence =['indianred', 'limegreen', 'aqua'], hover_data=[df_split[0]['Ft']])
plot2 = px.scatter(df_split[1], x='year', y='Enedc (g/km) mean', color='Mk', color_discrete_sequence =['darkmagenta', 'darkolivegreen', 'darkorange'], hover_data=[df_split[1]['Ft']])
plot3 = px.scatter(df_split[2], x='year', y='Enedc (g/km) mean', color='Mk', color_discrete_sequence =['deeppink', 'deepskyblue', 'dimgray'], hover_data=[df_split[2]['Ft']])
plot4 = px.scatter(df_split[3], x='year', y='Enedc (g/km) mean', color='Mk', color_discrete_sequence =['forestgreen', 'fuchsia', 'gainsboro'], hover_data=[df_split[3]['Ft']])
plot5 = px.scatter(df_split[4], x='year', y='Enedc (g/km) mean', color='Mk', color_discrete_sequence =['lavenderblush', 'lawngreen', 'lemonchiffon'], hover_data=[df_split[4]['Ft']])
plot6 = px.scatter(df_split[5], x='year', y='Enedc (g/km) mean', color='Mk', color_discrete_sequence =['magenta', 'maroon', 'mediumaquamarine'], hover_data=[df_split[5]['Ft']])
plot7 = px.scatter(df_split[6], x='year', y='Enedc (g/km) mean', color='Mk', color_discrete_sequence =['midnightblue', 'goldenrod', 'mediumseagreen'], hover_data=[df_split[6]['Ft']])
plot8 = px.scatter(df_split[7], x='year', y='Enedc (g/km) mean', color='Mk', color_discrete_sequence =['orangered', 'orchid', 'palegoldenrod'], hover_data=[df_split[7]['Ft']])
fig = make_subplots(rows=3, cols=3, shared_yaxes=True, x_title="Jaar", y_title="CO2 emission in NEDC (g/km)")
# Add the trace of each part to the plot.
fig.add_trace(plot1['data'][0], row=1, col=1)
fig.add_trace(plot1['data'][1], row=1, col=1)
fig.add_trace(plot1['data'][2], row=1, col=1)
fig.append_trace(plot2['data'][0], row=1, col=2)
fig.append_trace(plot2['data'][1], row=1, col=2)
fig.append_trace(plot2['data'][2], row=1, col=2)
fig.append_trace(plot3['data'][0], row=1, col=3)
fig.append_trace(plot3['data'][1], row=1, col=3)
fig.append_trace(plot3['data'][2], row=1, col=3)
fig.append_trace(plot4['data'][0], row=2, col=1)
fig.append_trace(plot4['data'][1], row=2, col=1)
fig.append_trace(plot4['data'][2], row=2, col=1)
fig.append_trace(plot5['data'][0], row=2, col=2)
fig.append_trace(plot5['data'][1], row=2, col=2)
fig.append_trace(plot5['data'][2], row=2, col=2)
fig.append_trace(plot6['data'][0], row=2, col=3)
fig.append_trace(plot6['data'][1], row=2, col=3)
fig.append_trace(plot6['data'][2], row=2, col=3)
fig.append_trace(plot7['data'][0], row=3, col=1)
fig.append_trace(plot7['data'][1], row=3, col=1)
fig.append_trace(plot7['data'][2], row=3, col=1)
fig.append_trace(plot8['data'][0], row=3, col=2)
fig.append_trace(plot8['data'][1], row=3, col=2)
fig.append_trace(plot8['data'][2], row=3, col=2)
# Plot settings
fig.update_layout(
showlegend=True,
height=800,
width=800,
title_text="Gemiddelde CO2-uitstoot van personenauto's per merk tussen 2015 en 2021",
legend_title="Automerk",
)
fig.update_xaxes(tickangle=-45, categoryarray=[2015, 2016, 2017, 2018, 2019, 2020, 2021], type='category')
fig.show()
Figuur 6. Deze subplot-scatterplot visualiseert de gemiddelde emissiewaarden (Enedc in g/km) van personenauto’s in verschillende merken (Mk) over meerdere jaren. De visualisatie bestaat uit acht scatterplots, waarbij elke plot de gemiddelde emissiewaarden voor drie automerken weergeeft. Elk subplot toont de veranderingen in emissiewaarden van een specifieke groep merken over de tijd, met het jaar op de x-as en de gemiddelde emissie op de y-as. Door de scatterplots te observeren, kunnen we de variaties in emissiewaarden tussen merken en jaren en tussen automerken identificeren.
Show code cell source
# Plot settings
fig = px.scatter(car_emission_mass,
x="m (kg)",
y="Ewltp (g/km)",
color="Ft",
labels={
"m (kg)": "Massa (kg)",
"Ewltp (g/km)": "CO2 emissie in WLTP (g/km)",
"Ft": "Brandstof Type",
},
)
# Create toggle visibility button for every fuel type.
buttons = []
for i, val in enumerate(car_emission_mass["Ft"].unique()):
button = dict(method='restyle',
label=val,
args=[{'visible': True}, [i]],
args2=[{'visible': "legendonly"}, [i]],
)
buttons.append(button)
# Menu settings
fig.update_layout(
updatemenus=[
dict(
buttons=buttons,
visible=False,
),
],
annotations=[
dict(text="Toggle traces by clicking the legend", x=0, xref="paper", y=1.05, yref="paper", align="right", showarrow=False),
],
title_text="CO2 emissie van personenauto's in de EU verdeeld bij massa (2021)",
legend_title="Brandstof type",
xaxis_title="Massa (kg)",
xaxis_range=(0, 3500),
yaxis_title="CO2 emissie in WLTP (g/km)",
yaxis_range=(0, 550),
)
fig.show()
Figuur 7. Deze scatterplot visualiseert de CO2-emissie van personenauto’s in de Europese Unie (EU) verdeeld op basis van hun massa in het jaar 2021. De x-as vertegenwoordigt de massa van de auto’s in kilogram (kg), terwijl de y-as de CO2-emissie in WLTP (g/km) aangeeft. Elke datapunt in de plot correspondeert met een specifieke auto en is gekleurd op basis van het brandstoftype (Ft). Door de grafiek te bestuderen, kunnen wij patronen en trends in CO2-emissie in relatie tot de massa van de auto’s onderzoeken. Verder kunnen we via de legenda de verschillende brandstoftypes in- of uitschakelen om de visualisatie aan te passen.
Reflectie#
Werk Distributie#
References#
Liu, Z., Ciais, P., Deng, Z., Lei, R., Davis, S. J., Feng, S., … & Schellnhuber, H. J. (2020). Near-real-time monitoring of global CO2 emissions reveals the effects of the COVID-19 pandemic. Nature communications, 11(1), 5172.
Xing, J., Leard, B., & Li, S. (2021). What does an electric vehicle replace?. Journal of Environmental Economics and Management, 107, 102432.
Originele dataset: https://www.eea.europa.eu/data-and-maps/data/co2-cars-emission-22
GitHub repository: FuYoshi/data_story_project
Verwerkte dataset: https://drive.google.com/file/d/1sTGPzVfk017Y8n2KPgsIxP9eXdl02YgH/view?usp=drive_link